home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / mxconbo / mxconbo.asm < prev    next >
Assembly Source File  |  1995-02-06  |  17KB  |  1,068 lines

  1. ; MXCON.ASM
  2. ; MXCON.COM Copyrights(c)1994 MIYAZAKI
  3. ; MXCONBO.COM Arranged 1995 by Boko.
  4.         .286
  5.     ; 1995/01/16 Nifty:FOAU2初公開版
  6.     ;    つねにGVRAMを表示するよう修正
  7.     ;    カーソル情報をDOS内部のワークから取得、BIOS(INT90)のフックを廃止
  8.     ;    全角文字上の全角カーソル
  9.     ;    charpal の背景拡大機能に対応
  10.     ; 1995/02/06 フリコレ10 応募版
  11.     ;    カーソルのちらつき修正
  12.     ;    パレット設定ルーンチ変更
  13.     ;    4プレーンすべて表示する
  14. code        segment
  15.         assume    cs:code,ds:nothing,es:nothing,ss:nothing
  16.  
  17.         org    02ch
  18. envseg        label    word
  19.  
  20.         org    080h
  21. cmdline        label    byte
  22.  
  23.         org    100h
  24. entry:        jmp    main
  25.  
  26. gvram0        equ    0c000h
  27. gvram        equ    0c019h
  28. cvram        equ    0c800h
  29. kvram        equ    0ca00h
  30. ankcg        equ    0cb00h
  31. io_work        equ    00040h
  32.     ; CRTCアドレス
  33. CRTC_ADR_REG    equ    00440h
  34.     ; CRTCデータ
  35. CRTC_DAT_REG    equ    00442h
  36.  
  37. max_x        equ    80
  38. max_y        equ    24
  39. max_y2        equ    25
  40. chrsiz        equ    16
  41. linsiz        equ    16
  42.  
  43. irq_code     equ    0bh
  44.     ; 画面更新間隔の設定
  45. vs_time        equ    4
  46.  
  47. ;*****************************
  48. ;*    work vram eria
  49. ;****************************
  50.     ; 常駐チェック用ID文字列
  51. chk_str        db    'MXCONBO'
  52. vs_cnt        db    vs_time
  53. vs_chk        db    0
  54.         align 4
  55. dmy_ram        dw    (max_x*max_y2) dup(0)
  56. cursor_e_ad    dw    0
  57. cursor_a_ad    dw    0
  58. cursor_f_ad    dw    0
  59. cursor_s_ad    dw    0
  60. cursor_p_adr    label    dword
  61. cursor_p_ad    dw    0
  62.         dw    io_work
  63. cur_xy        dw    0        ; low x , hi y
  64. vs_para        db    0,0
  65. vs_off        dw    ?
  66. vs_seg        dw    ?
  67. old_off        dw    ?
  68. old_seg        dw    ?
  69. irq_map        db    0,0,0,0
  70. vdb_ent        db    0
  71. cur_attr    db    02h        ; size = 2
  72. attr_flag    db    ?
  73.         even
  74. int_ent     proc    far
  75.         mov    dx,05cah
  76.         out    dx,al
  77.         sti
  78.  
  79.         dec    cs:[vs_cnt]
  80.         jne    int_rt
  81.         mov    cs:[vs_cnt],vs_time
  82.  
  83.         mov    ax,cs
  84.         mov    ds,ax
  85.     ; 二重エントリーは禁止
  86.         cmp    [vs_chk],0
  87.         jne    int_rt
  88.     ; TVRAM書き込みフラグチェック&クリア
  89.         mov    dx,05c8h
  90.         in    al,dx
  91.         test    al,80h
  92.         jne    int_go
  93.     ; カーソル位置チェック
  94.         les    bx,[cursor_p_adr]
  95.         mov    ax,es:[bx]
  96.         cmp    ax,[cur_xy]
  97.         je    int_rt
  98.  
  99. int_go:        mov    [vs_chk],1        ;多重割り込み防止
  100.         call    _cflush
  101.         mov    cs:[vs_chk],0
  102.  
  103. int_rt:        ret
  104. int_ent     endp
  105.  
  106.         assume    cs:code,ds:code,es:code,ss:nothing
  107.  
  108. ;****************************************
  109. ; wrt_ank
  110. ;   al:char ah:attr
  111. ;   cx:x    bx:y(VRAMアドレス)
  112. ;****************************************
  113.         align    4
  114. _wrt_ank     proc    near
  115.         push    ds
  116.         push    si
  117.         push    es
  118.         push    di
  119.         push    cx
  120.         push    bx
  121.  
  122.         mov    dx,ax
  123.         sub    dh,dh        ; char=>ankcg address [si]
  124.         shl    dx,4        ; * 16
  125.         mov    si,dx
  126.         mov    di,bx
  127.         add    di,cx
  128.  
  129.         mov    bl,ah
  130.         mov    cl,bl        ;cl
  131.         and    bx,7
  132.     ; 高輝度?
  133.     ; 94/01/05 ブリンク属性も
  134.         test    cl,30h        ;cl
  135.         je    $i147
  136.         or    bl,8        ;at
  137.  
  138. $i147:
  139.     ; リバース?
  140.         test    cl,08h
  141.         je    $i148
  142.         dec    bh        ;bk bh=0ffh
  143.  
  144. $i148:
  145.     ; フォントROMのセグメント
  146.         mov    ax,ankcg
  147.         mov    ds,ax
  148.     ; VRAMのセグメントセット
  149.         mov    ax,gvram
  150.         mov    es,ax
  151.     ; ANKCGを選択
  152.         mov    dx,0ff99h
  153.         mov    al,01h
  154.         out    dx,al
  155.     ; vramプレーン選択
  156.     ; (4プレーンに書き込み)
  157.         mov    dx,0ff81h
  158.         mov    cx,80-1
  159.     ; 色が同じなら消さない
  160.         cmp    cs:[attr_flag],0
  161.         je    same_attr_a
  162.         mov    al,0fh
  163.         out    dx,al
  164.         cmp    al,bl
  165.         je    $sclr
  166.     ; 文字を消す
  167.         sub    al,al
  168.         rept    16
  169.         stosb
  170.         add    di,cx
  171.         endm
  172.  
  173.         sub    di,80*16
  174.     ; vramプレーン
  175.     ; IRGBの選択
  176. same_attr_a:
  177.         mov    al,bl
  178.         out    dx,al
  179.  
  180. $sclr:        or    bh,bh
  181.         jne    $ff100
  182.     ; 文字書き込み
  183.     ; (ノーマル)
  184.         lodsw
  185.         mov    es:[di],al
  186.         mov    es:[di+80* 1],ah
  187.         lodsw
  188.         mov    es:[di+80* 2],al
  189.         mov    es:[di+80* 3],ah
  190.         lodsw
  191.         mov    es:[di+80* 4],al
  192.         mov    es:[di+80* 5],ah
  193.         lodsw
  194.         mov    es:[di+80* 6],al
  195.         mov    es:[di+80* 7],ah
  196.         lodsw
  197.         mov    es:[di+80* 8],al
  198.         mov    es:[di+80* 9],ah
  199.         lodsw
  200.         mov    es:[di+80*10],al
  201.         mov    es:[di+80*11],ah
  202.         lodsw
  203.         mov    es:[di+80*12],al
  204.         mov    es:[di+80*13],ah
  205.         lodsw
  206.         mov    es:[di+80*14],al
  207.         mov    es:[di+80*15],ah
  208. $ff101:
  209.     ; Kvram選択
  210.         mov    dx,0ff99h
  211.         xor    al,al
  212.         out    dx,al
  213.  
  214.         pop    bx
  215.         pop    cx
  216.         pop    di
  217.         pop    es
  218.         pop    si
  219.         pop    ds
  220.         ret    
  221.  
  222.         align    4
  223.     ; 文字書き込み
  224.     ; (リバース)
  225. $ff100:
  226.         rept    16
  227.         lodsb
  228.         xor    al,bh
  229.         stosb
  230.         add    di,cx
  231.         endm
  232.  
  233.         jmp    $ff101
  234. _wrt_ank    endp
  235. ;************************************
  236. ; wrt_kan
  237. ;   dx:漢字(反転注意)    ah:attr
  238. ;   cx:x              bx:y
  239. ;************************************
  240.         align    4
  241. _wrt_kan     proc    near
  242.         push    es
  243.         push    di
  244.         push    cx
  245.         push    bx
  246.  
  247.         mov    di,bx
  248.         add    di,cx        ;di=vram_address
  249.         mov    cl,ah
  250.  
  251.         mov    bx,cx
  252.         mov    cx,dx
  253.         xchg    ch,cl
  254.  
  255. ;****** bug fix start *******
  256.         cmp    ch,70h
  257.         jb    cnv_end
  258.         cmp    ch,74h
  259.         ja    cnv_end
  260.         cmp    cl,60h
  261.         jb    cnv_end
  262.         cmp    cl,7eh
  263.         ja    cnv_end
  264.         add    cx,07c0h
  265.  
  266. ;        jmp short cnv_end
  267. ;        align    4
  268. ;Not_Cnv:    cmp    ch,75h
  269. ;        je    Ext_Cnv
  270. ;        cmp    ch,76h
  271. ;        jne    Cnv_End
  272. ;Ext_Cnv:    sub    ch,75h
  273. ;        sub    cl,21h
  274. ;        mov    al,94
  275. ;        mul    ch
  276. ;        xor    ch,ch
  277. ;        add    ax,cx
  278. ;        mov    dx,ax
  279. ;        shr    dx,5     ; dx / 32
  280. ;        and    ax,1Fh    ; ax % 32
  281. ;        mov    ch,dl    ; dx * 256
  282. ;        mov    cl,al
  283. ;        add    cx,0900h
  284.  
  285. cnv_end:
  286. ;******* bug fix end ********
  287.  
  288.         xchg    ch,cl
  289.         mov    ax,cx
  290.         mov    cx,bx
  291.         mov    dx,0ff94h
  292.         out    dx,al
  293.         inc    dx
  294.         mov    al,ah
  295.         out    dx,al
  296.  
  297.         mov    bl,cl    ;cl
  298.         and    bx,7
  299.  
  300.         test    cl,30h    ;cl
  301.         je    $i247
  302.         or    bl,8            ;at
  303.  
  304. $i247:
  305.         test    cl,08h    ;cl
  306.         je    $i248
  307.         dec    bh            ;bk bh=0ffh
  308.  
  309. $i248:        mov    ax,gvram
  310.         mov    es,ax
  311.         mov    dx,0ff81h
  312.         mov    cx,80-2
  313.         cmp    cs:[attr_flag],0
  314.         je    same_attr_k
  315.         mov    al,0fh
  316.         out    dx,al
  317.         cmp    al,bl
  318.         je    $sclr_k
  319.  
  320.         sub    ax,ax
  321.  
  322. $f251:        rept    16
  323.         stosw
  324.         add    di,cx
  325.         endm
  326.  
  327.         sub    di,80*16
  328. same_attr_k:
  329.         mov    al,bl
  330.         out    dx,al
  331.  
  332. $sclr_k:    mov    dx,0ff96h
  333.         and    bh,bh
  334.         jne    $f277
  335. $ff200:
  336.         insb
  337.         inc    dx
  338.         insb
  339.         add    di,cx
  340.         rept    15
  341.         dec    dx
  342.         insb
  343.         inc    dx
  344.         insb
  345.         add    di,cx
  346.         endm
  347. $ff201:
  348.         pop    bx
  349.         pop    cx
  350.         pop    di
  351.         pop    es
  352.         ret    
  353.  
  354.         align    4
  355.  
  356. $f277:
  357.         in    al,dx
  358.         xor    al,bh
  359.         stosb
  360.         inc    dx
  361.         in    al,dx
  362.         xor    al,bh
  363.         stosb
  364.         add    di,cx
  365.  
  366.         rept    15
  367.         dec    dx
  368.         in    al,dx
  369.         xor    al,bh
  370.         stosb
  371.         inc    dx
  372.         in    al,dx
  373.         xor    al,bh
  374.         stosb
  375.         add    di,cx
  376.         endm
  377.         jmp    $ff201
  378. _wrt_kan    endp
  379.  
  380. ;***********************************************
  381. ;仮想VRAM部(DMYCON Ver2.03)
  382. ;                             by (山)
  383. ;***********************************************
  384.         public    _cflush
  385. _cflush        proc     near
  386.         push    ds
  387.         cld
  388.     ; tvramの
  389.     ; セグメント設定
  390.         mov    ax,cvram    ; cp
  391.         mov    ds,ax
  392.         xor    si,si
  393.     ; ダミーram(比較先)
  394.     ; セグメント設定
  395.         mov    ax,cs        ; dp
  396.         mov    es,ax
  397.         mov    di,offset dmy_ram
  398.  
  399.         xor    cx,cx        ; x:cx
  400.         xor    bx,bx        ; y:bx
  401.         align    4
  402.  
  403. cf_lp1:
  404.         mov    ax,[si]
  405.         sub    ah,es:[di+1]
  406.         mov    es:[attr_flag],ah
  407.     ; tvram attrから
  408.     ; 2 バイト取得
  409.         mov    ax,[si]
  410.     ; 漢字フラグ?
  411.         test    ah,40h
  412.         je    short cf_ank
  413.     ; 漢字vramから
  414.     ; 2 バイト取得
  415.         mov    dx,[si+2000h]
  416.     ; tvramとダミー
  417.     ; vramとの比較
  418.         cmp    dh,es:[di+0]
  419.         jne    short cf_knj
  420.         cmp    dl,es:[di+2]
  421.         jne    short cf_knj
  422.         cmp    ah,es:[di+1]
  423.         je    short cf_ked
  424.  
  425. cf_knj:
  426.     ; ダミーvramを更新して
  427.     ; tvramの内容と
  428.     ; 等しくする
  429.         mov    es:[di+1],ah
  430.         mov    es:[di+0],dh
  431.         mov    es:[di+2],dl
  432.         mov    byte ptr es:[di+3],0bfh
  433.     ; 2バイト文字の表示
  434.         call    _wrt_kan
  435. cf_ked:        add    si,4
  436.         add    di,4
  437.         add    cx,2
  438.         jmp    short cf_end
  439.         align    4
  440.  
  441. cf_ank:
  442.     ; tvramとダミーvramとの比較
  443.         cmp    ax,es:[di]
  444.     ; ダミーvramの更新
  445.         stosw
  446.         je    short cf_aed
  447.         call    _wrt_ank
  448. cf_aed:        add    si,2
  449.         inc    cx
  450.  
  451. cf_end:        cmp    cx,max_x
  452.         jb    short cf_lp1
  453.         sub    cx,max_x
  454.         add    bx,80*linsiz
  455.         cmp    bx,max_y2*80*linsiz
  456.         jb    short cf_lp1
  457.  
  458.         pop    ds
  459.  
  460. ;*****************************
  461. ; locate
  462. ;*****************************
  463. _locate        proc    near
  464.  
  465.         mov    al,0fh
  466.         mov    dx,0fda0h
  467.         out    dx,al
  468.  
  469.     ; カーソルアトリビュート
  470.         mov    ax,io_work
  471.         mov    es,ax
  472.         mov    bx,[cursor_a_ad]
  473.         mov    al,es:[bx]
  474.         and    al,060h
  475.         cmp    al,020h
  476.         je    loca_ret
  477.     ; カーソル表示/非表示
  478.         mov    bx,[cursor_f_ad]
  479.         cmp    byte ptr es:[bx],0
  480.         jne    loca_ret
  481.     ; カーソル行桁位置
  482.         inc    BX
  483.         mov    cx,es:[bx]
  484.         mov    [cur_xy],cx
  485.         sub    cx,00101h
  486.         mov    bl,ch
  487.         xor    ch,ch
  488.  
  489.         mov    ax,max_x
  490.         mul    bl
  491.         add    ax,cx
  492.         shl    ax,1
  493.         add    ax,offset dmy_ram
  494.         mov    di,ax
  495.     ; カーソルの幅(Byte/Word)設定
  496.         mov    byte ptr [loca1+1],0f6h    ; カーソル半角
  497.         test    byte ptr [di+1],040h
  498.         je    l_ank
  499.         mov    byte ptr [loca1+1],0f7h    ; カーソル全角
  500. l_ank:
  501.         xor    byte ptr [di+1],007h
  502.  
  503.         shl    bx,4        ; y *= 16
  504.         xor    ah,ah
  505.         mov    di,[cursor_e_ad]
  506.         mov    al,byte ptr es:[di]
  507.         mov    di,[cursor_s_ad]
  508.         sub    al,byte ptr es:[di]
  509.         inc    ax
  510.         mov    [cur_attr],al
  511.         mov    al,byte ptr es:[di]
  512.         add    bx,ax
  513.         mov    ax,80
  514.  
  515.         mul    bx        ; y *= 80
  516.         add    ax,cx        ; y + x
  517.         mov    di,ax
  518.  
  519.         mov    ax,gvram
  520.         mov    es,ax
  521.         mov    dx,0ff81h
  522.         mov    al,00000001b
  523.         call    loca_sub
  524.         mov    al,01000010b
  525.         call    loca_sub
  526.         mov    al,10000100b
  527.         call    loca_sub
  528.         mov    al,11001000b
  529.         call    loca_sub
  530. loca_ret:
  531.         ret    
  532.  
  533. loca_sub:    out    dx,al
  534.         push    di
  535.         xor    cx,cx
  536.         mov    cl,[cur_attr]
  537.  
  538. loca1:        not    byte ptr es:[di]    ; 実行時に書換えしてます。
  539.         add    di,80
  540.         loop    loca1
  541.         pop    di
  542.         ret
  543. _locate        endp
  544.  
  545. _cflush        endp
  546.  
  547. start_init    label    word
  548.  
  549. ;********************************************************
  550. ;    割り込みの設定
  551. ;********************************************************
  552.  
  553. vs_set        proc    near
  554.         push    ds
  555.  
  556.         cli
  557.     ; FM音源タイマB割り込み
  558.     ; 標準DOSコンソール停止
  559.         mov    dx,04d8h
  560. vs_set_1:    in    al,dx
  561.         test    al,80h
  562.         jnz    vs_set_1
  563.         mov    dx,04d8h
  564.         mov    al,27h
  565.         out    dx,al
  566.     ; wait
  567.         jmp short $+2
  568.         jmp short $+2
  569.  
  570.         mov    dx,04d8h
  571. vs_set_2:    in    al,dx
  572.         test    al,80h
  573.         jnz    vs_set_2
  574.         mov    dx,04dah
  575.         mov    al,00h
  576.         out    dx,al
  577.         sti
  578.     ; vsync割込アドレスの取り出し
  579.         mov    ah,01h
  580.         mov    dl,irq_code
  581.         int    0aeh
  582.     ; 旧vsync割込アドレス保存
  583.         mov    cs:[old_off],di
  584.         mov    cs:[old_seg],ds
  585.     ; vsync割込ルーチン登録
  586.         push    cs
  587.         pop    ds
  588.         mov    di,offset int_ent
  589.         mov    cs:[vs_off],di
  590.         mov    cs:[vs_seg],ds
  591.         mov    di,offset vs_para
  592.         mov    ah,00h
  593.         mov    dl,irq_code
  594.         int    0aeh
  595.     ; 割込許可データ取り出し
  596.         mov    ah,03h
  597.         mov    di,offset irq_map
  598.         int    0aeh
  599.     ; VSYNC割り込み許可
  600.         or    byte ptr ds:[di+2],08h
  601.         mov    ah,02h
  602.         int    0aeh
  603.     ; VSYNC割り込み要因クリア
  604.         mov    dx,05cah
  605.         out    dx,al
  606.         pop    ds
  607.         ret
  608. vs_set        endp
  609.  
  610. vs_reset     proc    near
  611.         push    ds
  612.  
  613.         push    cs
  614.         pop    ds
  615.     ; 割込許可データ取り出し
  616.         mov    ah,03h
  617.         mov    di,offset irq_map
  618.         int    0aeh
  619.     ; VSYNC割り込み禁止
  620.         and    byte ptr cs:[di+2],0f7h
  621.         mov    ah,02h
  622.         int    0aeh
  623.     ; 旧vsync割込ルーチン復旧
  624.         mov    di,es:[old_off]
  625.         mov    ds,es:[old_seg]
  626.         mov    ah,00h
  627.         mov    dl,irq_code
  628.         int    0aeh
  629.  
  630.     ; FM音源タイマB割り込み
  631.     ; 標準DOSコンソール再開
  632.         cli
  633.         mov    dx,04d8h
  634. vs_reset_1:    in    al,dx
  635.         test    al,80h
  636.         jnz    vs_reset_1
  637.         mov    dx,04d8h
  638.         mov    al,27h
  639.         out    dx,al
  640.     ; wait
  641.         jmp short $+2
  642.         jmp short $+2
  643.  
  644.         mov    dx,04d8h
  645. vs_reset_2:    in    al,dx
  646.         test    al,80h
  647.         jnz    vs_reset_2
  648.         mov    dx,04dah
  649.         mov    al,2ah
  650.         out    dx,al
  651.         sti
  652.  
  653.         pop    ds
  654.         ret
  655. vs_reset     endp
  656.  
  657. pal_tbl        dw    00000h
  658.         dw    000b0h
  659.         dw    00b00h
  660.         dw    00bb0h
  661.         dw    0b000h
  662.         dw    0b0b0h
  663.         dw    0bb00h
  664.         dw    0bbb0h
  665.         dw    04440h
  666.         dw    000f0h
  667.         dw    00f00h
  668.         dw    00ff0h
  669.         dw    0f000h
  670.         dw    0f0f0h
  671.         dw    0ff00h
  672.         dw    0fff0h
  673.  
  674. palet_init    proc    near
  675.     ; レイア0の16色
  676.     ; パレット選択
  677.         mov    dx,00448h
  678.         mov    al,1
  679.         out    dx,al
  680.         inc    dx
  681.         inc    dx
  682.         mov    al,0
  683.         out    dx,al
  684.         sub    cl,cl
  685.         mov    si,offset pal_tbl
  686. pal_init_1:    mov    al,cl
  687.         mov    dx,0fd90h
  688.         out    dx,al
  689.         lodsw
  690.         call    palet_init_sub
  691.         call    palet_init_sub
  692.         call    palet_init_sub
  693.         inc    cl
  694.         cmp    cl,16
  695.         jb    pal_init_1
  696.         ret    
  697. palet_init_sub:
  698.         inc    dx
  699.         inc    dx
  700.         out    dx,al
  701.         ror    ax,4
  702.         ret
  703. palet_init    endp
  704.  
  705. trap_chk    proc    near
  706.     ; 常駐チェックルーチン
  707.         push    ds
  708.         push    es
  709.  
  710.     ; vsync割込アドレスの取り出し
  711.         mov    ah,01h
  712.         mov    dl,irq_code
  713.         int    0aeh
  714.         mov    cs:[vs_seg],ds
  715.         cld
  716.         mov    cx,7
  717.         mov    si,offset chk_str
  718.         mov    di,offset chk_str
  719.     repe    cmpsb
  720.  
  721.         pop    es
  722.         pop    ds
  723.         ret
  724. trap_chk    endp
  725.  
  726. main        proc    near
  727.         cld
  728.  
  729.         mov    si,offset cmdline
  730.         lodsb
  731.         mov    ah,al
  732. main_cmd:    cmp    ah,0
  733.         je    main_init
  734.         dec    ah
  735.         lodsb
  736.         cmp    al,'-'
  737.         jne    main_cmd
  738.  
  739.         call    trap_chk
  740.         jne    main_ret
  741.     ; 常駐解除
  742.         call    vs_reset
  743.     ; メモリ開放
  744.         mov    es,[vs_seg]
  745.         mov    ah,49h
  746.         int    21h
  747.     ; GVRAMクリア
  748.         mov    ax,gvram0
  749.         mov    es,ax
  750.         mov    dx,0ff81h
  751.         mov    al,0fh
  752.         out    dx,al
  753.         xor    ax,ax
  754.         mov    cx,80*409/2
  755.         mov    di,0
  756.     rep    stosw
  757.     ; 全画面消去
  758.         mov    ah,02h
  759.         int    91h
  760.  
  761.         mov    al,0fh
  762.         mov    dx,0fda0h
  763.         out    dx,al
  764.     ; crtc 戻す
  765.         mov    al,0dh
  766.         mov    bx,0040h
  767.         call    crtc_data_set
  768.         mov    al,0Eh
  769.         mov    bx,0360h
  770.         call    crtc_data_set
  771.  
  772.         jmp short main_ret
  773.  
  774. main_init:
  775.         call    trap_chk
  776.         je    main_ret
  777.     ; カーソル情報のdos 内部ワークを検索
  778.         call    search
  779.         jnz    main_ret
  780.     ; 文字を完全に消す
  781.         call    clear_scrn1
  782.     ; パレット初期化
  783.         call    palet_init
  784.     ; 標準DOSコンソール停止
  785.     ; VSYNC割り込み開始
  786.         call    vs_set
  787.     ; カーソル表示,システム行ありに設定
  788.         call    set_scrn
  789.     ; 環境変数領域開放
  790.         mov    si,offset envseg
  791.         mov    ax,cs:[si]
  792.         mov    es,ax
  793.         mov    ah,49h
  794.         int    21h
  795.     ; 常駐終了
  796.         mov    dx,offset start_init
  797.         add    dx,15
  798.         shr    dx,4
  799.         mov    ax,3100h
  800.         int    21h
  801.     ; プロセス終了
  802. main_ret:    mov    ax,4c00h
  803.         int    21h
  804.  
  805. main        endp
  806.  
  807.     ; 94/12/28 追加 start by boko.
  808. clear_scrn1    proc    near
  809.     ; レイア1 側の画面を完全に消去する
  810.  
  811.     ; カーソル非表示
  812.         mov    ax,0b01h
  813.         int    91h
  814.     ; システム行の文字を保存
  815.     ; Kvram選択
  816.         mov    dx,0ff99h
  817.         xor    al,al
  818.         out    dx,al
  819.         push    ds
  820.         mov    ax,cvram
  821.         mov    ds,ax
  822.         mov    si,max_x * 2 * 24
  823.         mov    di,offset mode_save_1
  824.         mov    cx,max_x
  825.     rep    movsw        
  826.         mov    si,max_x * 2 * 24 + 02000h
  827.         mov    cx,max_x
  828.     rep    movsw
  829.         pop    ds
  830.     ; 画面モード取得
  831.         mov    ah,01ch
  832.         int    91h
  833.     ; システム行なしに設定
  834.     ;(oakモード表示域も消したい)
  835.         and    al,10000111b
  836.         mov    ah,01bh
  837.         int    91h
  838.     ; 全画面消去
  839.         mov    ah,02h
  840.         int    91h
  841.     ; 300msec 待つ
  842.         mov    cx,30000
  843.         int    0fdh    
  844.         ret
  845. clear_scrn1    endp        
  846.  
  847. set_scrn    proc
  848.     ; カーソル表示
  849.         mov    ax,0b00h
  850.         int    91h
  851.     ; 画面モード取得
  852.         mov    ah,01ch
  853.         int    91h
  854.     ; システム行ありに設定
  855.         and    al,11000111b
  856.         or    al,01000000b
  857.         mov    ah,01bh
  858.         int    91h
  859.     ; 保存したシステム行を復帰
  860.         mov    dx,0ff99h
  861.         xor    al,al
  862.         out    dx,al
  863.         push    es
  864.         mov    ax,cvram
  865.         mov    es,ax
  866.         mov    di,max_x * 2 * 24
  867.         mov    si,offset mode_save_1
  868.         mov    cx,max_x
  869.     rep    movsw        
  870.         mov    si,max_x * 2 * 24 + 02000h
  871.         mov    cx,max_x
  872.     rep    movsw
  873.         pop    es
  874.     ; crtc 変更
  875.         mov    al,0dh
  876.         mov    bx,0036h
  877.         call    crtc_data_set
  878.         mov    al,0Eh
  879.         mov    bx,0368h
  880.         call    crtc_data_set
  881.     ; 4プレーン全部表示
  882.         mov    dx,0FF82h
  883.         mov    al,001100111b
  884.         out    dx,al
  885.         ret
  886.  
  887. set_scrn    endp
  888.  
  889. search        proc    near
  890.  
  891. c_style_search:
  892.     ; カーソル表示
  893.     ; カーソル形状設定
  894.     ; 低速ブリンク・拡張
  895.         call    curs_style_070f
  896.     ; 設定したパターン
  897.     ; (07h,0fh)を
  898.     ; io.sysの内部作業
  899.     ; 領域から検索する。
  900.     ; 検索するのは
  901.     ; 0040:0000-0040:ffff
  902.     ; の範囲
  903.         push    es
  904.         mov    ax,00040h
  905.         mov    es,ax
  906.         mov    di,0
  907.         mov    cx,0ffffh
  908.     ; dos ver.5.0/6.2の場合
  909. dos5_loop:
  910.         mov    ax,0070fh
  911.         call    scan_word
  912.         jnz    dos3
  913.         mov    ax,di
  914.         mov    cursor_s_ad,ax
  915.         dec    ax
  916.         mov    cursor_e_ad,ax
  917.         inc    di
  918.         cmp    byte ptr es:[di],0
  919.         jne    dos5_loop
  920.         call    check_style
  921.         jc    dos5_loop
  922.         jmp short c_flag_search
  923. dos3:
  924.         mov    di,0
  925.     ; スキャンするサイズ 
  926.         mov    cx,0ffffh
  927.     ; dos ver. 3.1  の場合
  928.     ; 格納順がdos 5とは異なる
  929. dos3_loop:
  930.         mov    ax,00f07h
  931.         call    scan_word
  932.         jnz    error
  933.         mov    ax,di
  934.         mov    cursor_e_ad,ax
  935.         dec    ax
  936.         mov    cursor_s_ad,ax
  937.         inc    di
  938.         cmp    byte ptr es:[di],0
  939.         jne    dos3_loop
  940.         call    check_style
  941.         jc    dos3_loop
  942. c_flag_search:
  943.         
  944. error:
  945. exit:
  946.         pop    es
  947.         ret
  948. search        endp
  949.  
  950.  
  951. scan_word    proc
  952.     ; 検索サブルーチン
  953.     ; in
  954.     ;    ax : 検索パターン
  955.     ; out
  956.     ;    z  : 発見
  957.     ;    di : 発見アドレス+1
  958.     ;    nz : 見つからない
  959. scan_loop:
  960.     repnz    scasb
  961.         jne    not_found
  962.         cmp    ah,es:[di]
  963.         jne    scan_loop
  964. not_found:
  965.         ret
  966. scan_word    endp
  967.  
  968. check_style    proc
  969.         mov    cursor_f_ad,di
  970.         dec    ax
  971.         mov    cursor_a_ad,ax
  972.     ; 再びカーソルの
  973.     ; 形を変更する
  974.         mov    ax,00900h
  975.         mov    dx,00e0fh
  976.         int    091h
  977.     ; あたりをつけた
  978.     ; アドレスの内容が
  979.     ; 設定した値に変更
  980.     ; されてる事を確認
  981.         mov    bx,[cursor_s_ad]
  982.         cmp    byte ptr es:[bx],0eh
  983.         jne    curs_style_070f
  984.         mov    bx,[cursor_e_ad]
  985.         cmp    byte ptr es:[bx],0fh
  986.         jne    curs_style_070f
  987.     ; カーソル非表示
  988.         mov    ax,00b01h
  989.         int    091h
  990.     ; あたりをつけた
  991.     ; アドレスの内容が
  992.     ; 設定した値に変更
  993.     ; されてる事を確認
  994.         mov    bx,[cursor_f_ad]
  995.         cmp    byte ptr es:[bx],01h
  996.         jne    curs_style_070f
  997.     ; カーソル行桁の
  998.     ; 内部ワーク検索
  999.         mov    ax,00406h
  1000.         call    scan_word
  1001.         mov    bx,di
  1002.         dec    bx
  1003.         mov    [cursor_p_ad],bx
  1004.     ; カーソル行桁変更
  1005.         mov    ah,00dh
  1006.         mov    dx,00101h
  1007.         int    091h
  1008.     ; あたりをつけた
  1009.     ; アドレスの内容が
  1010.     ; 設定した値に変更
  1011.     ; されてる事を確認
  1012.         cmp    word ptr es:[bx],00101h
  1013.         jne    curs_style_070f
  1014.         ret
  1015.  
  1016. curs_style_070f:
  1017.     ; カーソルを
  1018.     ; 検索対象の
  1019.     ; パターンにする
  1020.         push    bx
  1021.         push    cx
  1022.         push    di
  1023.         mov    ax,0095fh
  1024.         mov    dx,0070fh
  1025.     ; 無関係のレジスタは
  1026.     ; dos内部のスタック領域の
  1027.     ; 誤検索を防止するため
  1028.     ; ffffにする
  1029.         mov    bx,0ffffh
  1030.         mov    cx,bx
  1031.         mov    si,bx
  1032.         mov    di,bx
  1033.         int    091h
  1034.     ; カーソル表示
  1035.         mov    ax,00b00h
  1036.         int    091h
  1037.     ; カーソル位置設定
  1038.         mov    ah,00dh
  1039.         mov    dx,00406h
  1040.         int    091h
  1041.  
  1042.         pop    di
  1043.         pop    cx
  1044.         pop    bx
  1045.     ; carry フラグセット
  1046.         stc
  1047.         ret
  1048. check_style    endp
  1049.  
  1050. crtc_data_set    proc
  1051.     ; in AL CRTC レジスタ番号
  1052.     ;    BX そのレビジスタにセットする値
  1053.         push    ax
  1054.         mov    dx,CRTC_ADR_REG
  1055.         out    dx,al
  1056.         mov    dx,CRTC_DAT_REG
  1057.         mov    ax,bx
  1058.         out    dx,ax
  1059.         pop    ax
  1060.         ret
  1061. crtc_data_set    endp
  1062.  
  1063. mode_save_1    dw    max_x dup (?)
  1064. mode_save_2    dw    max_x dup (?)
  1065.  
  1066. code        ends
  1067.         end    entry
  1068.